package 力扣.双指针.最长区间;

import java.awt.image.BandedSampleModel;

public class 数组中的最长山脉845 {
    public int longestMountain(int[] A) {
        final int N = A == null ? 0 : A.length;
        if (N < 3) {
            return 0;
        }

        int left = -1;

        // 区间的信息状态
        // 1. 前面一个值的大小
        int preValue = A[0];
        // 2. 区间的状态
        int status = -1; // -1表示只有一个元素，0表示上升, 1表示下降
        // 一个有效的区间，里面应该只有一个山峰

        // 记录最长的区间
        int ans = 0;

        for (int i = 1; i < N; i++) {
            final int x = A[i];

            // 如果只有一个元素
            if (status == -1) {
                if (x > preValue) {
                    status = 0;
                } else {
                    left = i - 1;
                }
            } else {
                // 当前状态正在上升
                if (status == 0) {
                    if (x > preValue) {
                        // nothing
                    } else if (x == preValue) {
                        status = -1;
                        left = i - 1;
                    } else {
                        // 状态变成下降
                        status = 1;
                    }
                } else {
                    // 当前状态正在下降
                    if (x < preValue) {
                        // nothing
                    } else if (x == preValue) {
                        status = -1;
                        left = i - 1;
                    } else {
                        // 值又变大
                        left = i - 2;
                        status = 0;
                    }
                }
            }
            preValue = x;

            if (status == 1) {
                ans = Math.max(ans, i - left);
            }
        }

        // 要求长度至少为3
        return ans >= 3 ? ans : 0;
    }

    public int longestMountain2(int[] arr) {
         if (arr == null || arr.length == 0){
             return 0;
         }
         int ans = 0;
         int left = -1;
         int preValue = arr[0];
         int status = -1;//区间的状态 -1:只有一个元素 0:上升 1:下降
        for (int i = 1; i < arr.length; i++) {
            int t = arr[i];
            if (status == -1){//只有一个元素
                if (t > preValue){//上升
                    status = 0;
                }else {
                    left = i - 1;
                }
            }else if (status == 0){//上升
                if (t > preValue){
                    // nothing
                }else if (t == preValue){//平顶山
                    left = i - 1;
                    status = -1;
                }else {//下降
                    status = 1;
                }
            }else {//下降
                if (t > preValue){//上升
                    left = i - 2;
                    status = 0;
                }else if(t == preValue){//平了
                    left = i - 1;
                    status = -1;
                }else {//下降
                    // nothing
                }
            }
            preValue = t;
            if (status == 1){//只有下山时才能计算山脉的长度
                ans = Math.max(ans, i - left);
            }
        }
        return ans >= 3 ? ans : 0;
    }
}
